package com.jdd.modules.parkcar.service.impl;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jdd.common.constant.BooleanTypeKind;
import com.jdd.common.constant.JddConstant;
import com.jdd.modules.parkcar.entity.ParkCarMonthly;
import com.jdd.modules.parkcar.mapper.ParkCarMonthlyMapper;
import com.jdd.modules.parkcar.service.IParkCarMonthlyService;
import com.jdd.modules.parkmonthly.dto.MonthlyCardInfoDTO;

/**
 * @Description: 月租车信息
 * @Author: jdd
 * @Date:   2021-05-24
 * @Version: V1.0
 */
@Service
public class ParkCarMonthlyServiceImpl extends ServiceImpl<ParkCarMonthlyMapper, ParkCarMonthly> implements IParkCarMonthlyService {

    @Resource
    ParkCarMonthlyMapper parkCarMonthlyMapper;

    @Override
    public IPage<MonthlyCardInfoDTO> monthlyCarInfoList(Page<MonthlyCardInfoDTO> page, QueryWrapper<MonthlyCardInfoDTO> queryWrapper) {
        queryWrapper.isNotNull("park_car_monthly.monthly_card_id");
        queryWrapper.groupBy("monthly_card_info.id");
        queryWrapper.eq("monthly_card_info.del_flag",0);
        queryWrapper.eq("park_car_monthly.del_flag",0);
        return parkCarMonthlyMapper.monthlyCarInfoList(page,queryWrapper);
    }


    @Override
    public List<MonthlyCardInfoDTO> monthlyCarInfo(List<MonthlyCardInfoDTO> list,QueryWrapper<MonthlyCardInfoDTO> queryWrapper) {
        queryWrapper.isNotNull("park_car_monthly.monthly_card_id");
        queryWrapper.groupBy("monthly_card_info.id");
        queryWrapper.eq("park_car_monthly.del_flag",0);
        queryWrapper.eq("monthly_card_info.del_flag",0);
        return parkCarMonthlyMapper.monthlyCarInfo(list,queryWrapper);
    }

    @Override
    public List<String> monthlyCarInfoIds(QueryWrapper<ParkCarMonthly> queryWrapper) {
        return parkCarMonthlyMapper.monthlyCarInfoIds(queryWrapper);
    }

	@Override
	public List<ParkCarMonthly> getByPackCodeParkCarMonthlyCount(List<String> plateNo) {
		LambdaQueryWrapper<ParkCarMonthly> wrapper = Wrappers.lambdaQuery();
		wrapper.in(ParkCarMonthly::getPlateNo, plateNo);
		wrapper.groupBy(ParkCarMonthly::getMonthlyCardId);
		return parkCarMonthlyMapper.selectList(wrapper);
	}
    @Override
    public ParkCarMonthly findByPlateNo(String plateNo,String status) {
        return parkCarMonthlyMapper.getLeisureParkNumber(plateNo,status);
    }
    @Override
    public List<ParkCarMonthly> getMonthlyListInPark(String parkCode, String plateNo, String status) {
        LambdaQueryWrapper<ParkCarMonthly> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ParkCarMonthly::getParkCode,parkCode);
        queryWrapper.eq(ParkCarMonthly::getPlateNo,plateNo);
        queryWrapper.eq(ParkCarMonthly::getStatus,status);
        return this.list(queryWrapper);
    }

    @Override
    public void removeAllInfo() {
        parkCarMonthlyMapper.removeAllInfo();
    }
    @Override
	public List<String> getTemporaryCarList(String areaId, String plateNo, String parkNumber,String monthlyCardId) {
		LambdaQueryWrapper<ParkCarMonthly> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ParkCarMonthly::getAreaId,areaId);
        queryWrapper.ne(ParkCarMonthly::getPlateNo,plateNo);
        queryWrapper.eq(ParkCarMonthly::getStatus,JddConstant.ParkWhiteListConstant.LICENSE_STATUS_Y);
        queryWrapper.eq(ParkCarMonthly::getParkNumber, parkNumber);
        queryWrapper.eq(ParkCarMonthly::getMonthlyCardId, monthlyCardId);
        queryWrapper.eq(ParkCarMonthly::getDelFlag, BooleanTypeKind.YES.value());
        List<String> plateNoList = this.list(queryWrapper).stream().map(entity -> {
        	return entity.getPlateNo();
        }).collect(Collectors.toList());
		return plateNoList;
	}
    @Override
    public List<ParkCarMonthly> getAreaMonthlyCarInfo(String areaId, String plateNo, String licenseStatusY) {
        LambdaQueryWrapper<ParkCarMonthly> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ParkCarMonthly::getAreaId,areaId);
        queryWrapper.eq(ParkCarMonthly::getPlateNo,plateNo);
        queryWrapper.eq(ParkCarMonthly::getStatus,licenseStatusY);
        queryWrapper.orderByDesc(ParkCarMonthly::getEndTime);
        return this.list(queryWrapper);
    }


	@Override
	public List<ParkCarMonthly> getEntranceMonthlyInfo(String parkCode, String plateNo, String licenseStatusY) {
		LambdaQueryWrapper<ParkCarMonthly> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ParkCarMonthly::getParkCode,parkCode);
        queryWrapper.eq(ParkCarMonthly::getPlateNo,plateNo);
        queryWrapper.eq(ParkCarMonthly::getStatus,licenseStatusY);
        queryWrapper.eq(ParkCarMonthly::getDelFlag, BooleanTypeKind.YES.value());
        queryWrapper.orderByDesc(ParkCarMonthly::getEndTime);
        return this.list(queryWrapper);
	}

    @Override
    public List<ParkCarMonthly> getMonthlyListInParkV3(String parkCode,String plateNo,String status){
        /*LambdaQueryWrapper<ParkCarMonthly> queryWrapper = new LambdaQueryWrapper<>();
        // 不过滤被注销的月卡信息，月卡判定完全按照入场纪录
        queryWrapper.eq(ParkCarMonthly::getParkCode,parkCode);
        queryWrapper.eq(ParkCarMonthly::getPlateNo,plateNo);
        queryWrapper.eq(ParkCarMonthly::getStatus,status);
        queryWrapper.isNotNull(ParkCarMonthly::getMonthlyCardId);
    	return this.list(queryWrapper);*/
    	return parkCarMonthlyMapper.getByPlateNoParkCarMonthlyList(plateNo, parkCode, status);
    }

    @Override
	public List<ParkCarMonthly> getByPackCodeParkCarMonthlyCount(String parkCode, String[] plateNo) {
		LambdaQueryWrapper<ParkCarMonthly> wrapper = Wrappers.lambdaQuery();
		wrapper.eq(ParkCarMonthly::getParkCode, parkCode);
		wrapper.in(ParkCarMonthly::getPlateNo, Arrays.asList(plateNo));
		wrapper.groupBy(ParkCarMonthly::getMonthlyCardId);
		return parkCarMonthlyMapper.selectList(wrapper);
	}
	@Override
    public List<ParkCarMonthly> getAllMonthlyInfoByAreaIdAndMonthlyCardId(String monthlyCardId,String areaId){
        LambdaQueryWrapper<ParkCarMonthly> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(ParkCarMonthly::getMonthlyCardId,monthlyCardId);
        wrapper.eq(ParkCarMonthly::getAreaId,areaId);
        wrapper.eq(ParkCarMonthly::getDelFlag,"0");
        wrapper.eq(ParkCarMonthly::getStatus,"Y");
        return this.list(wrapper);
    }


}
